package com.itany.mall.service.impl;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.itany.mall.dao.OrderDetailDao;
import com.itany.mall.dao.UserDao;
import com.itany.mall.entity.OrderDetail;
import com.itany.mall.entity.User;
import com.itany.mall.exception.UserNotFoundException;
import com.itany.mall.factory.Autowired;
import com.itany.mall.factory.Component;
import com.itany.mall.service.UserService;

@Component
public class UserServiceImpl implements UserService {

	// 该属性是需要由工厂装配对象
	// 通过注解告诉工厂
	// 要装配的目标对象, 必须是被工厂管理的对象
	// 也就是说目标对象的类头上一定要加@Component注解
	@Autowired
	private UserDao userDao;

	@Autowired
	private OrderDetailDao orderDetailDao;

	@Override
	public User login(String name, String password) throws UserNotFoundException {
		User u = userDao.selectByLoginNameAndPassword(name, password);
		if (u == null) {
			throw new UserNotFoundException();
		}
		return u;
	}

	// alice第一次登录, 选购1号商品2件
	// 退出时, 会被保存到数据库
	// alice再次登录, 购物车信息被加载
	// alice又选购了1件1号商品
	// 此时购物车中信息, 是已保存过的信息的更新
	// alice再次退出时, 此条购物记录应当是更新

	// alice在第二次登录时, 又选购了2号商品1件, 这是一件新的选购记录
	// 当alice退出时, 应当做保存

	@Override
	public void saveCart(Map<Long, OrderDetail> cart) {
		orderDetailDao.saveOrUpdateOrderDetails(cart.values());
	}

	@Override
	public Map<Long, OrderDetail> loadCart(long userId) {
		Map<Long, OrderDetail> map = new HashMap<>();
		// dao查询出所有与指定用户相关的OrderDetail
		List<OrderDetail> ods = orderDetailDao.selectByUserId(userId);
		// 从这些od中将购物车信息筛选出来, 封装成购物车Map
		for (OrderDetail od : ods) {
			// 没有订单信息的详情, 是购物车信息
			if (od.getOrder() == null) {
				map.put(od.getProduct().getId(), od);
			}
		}

		return map;
	}

}
